#include <iostream>
#include <unistd.h>
#include <unistd.h>
#include <fcntl.h>
#include <cstdio>
#include <cstring>
#include <vector>
#include <functional>

using namespace std;

void Print()
{
    cout << "adasdasdasdasda" << endl;
}
void setNoBlock(int fd)
{
    //1.获取属性
    int f1 = fcntl(fd, F_GETFL);
    if(f1 < 0)
    {
        //获取失败
        std::cerr << "error string: " << strerror(errno) << " error code: " << errno << std::endl;
        return;
    }
    //2.将fd设置为非阻塞
    fcntl(fd, F_SETFL, f1 | O_NONBLOCK);
}

int main()
{
    char buffer[1024];
    setNoBlock(0);//将标准输入IO设置为非阻塞IO
    //设置完成后，read如果没有读取成功的话也不会一直阻塞，代码也可以执行其他任务
    while(1)
    {
        printf(">>> ");
        fflush(stdout);
        // 1. 成功  2. 结束  3. 出错(一旦底层没有数据就绪，以出错的形式返回，但是不算真正的出错)
        ssize_t n = read(0, buffer, sizeof(buffer));//等+拷贝
        if(n > 0)
        {
            buffer[n-1] = 0;
           cout << "echo# " << buffer << endl;
        }
        else if(n == 0)
        {
            cout << "end file" << endl;
            break;
        }
        else
        {
            //EAGAIN/EWOULDBLOCK == 11;
            if(errno == EAGAIN || errno == EWOULDBLOCK)
            {
                Print();
                sleep(1);
                //说明还没有数据，即可读事件未就绪,重新进行读取
                std::cout << "data not ready" << std::endl;
                continue;
            }
            else if(errno == EINTR)
            {
                //说明这次IO被信号中断，需要重新读取
                continue;
            }
            else
            {
                //真的出错了
                std::cerr << "read error? "
                          << "error string: " << strerror(errno) << " error code: " << errno << std::endl;
                break;
            }
        }   
    }
    return 0;
}